package com.regent.central.bill.repository.mrp;

import com.regent.central.bill.core.mrp.BillMaterialPurchase;
import com.regent.central.bill.repository.mrp.dto.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.time.LocalDateTime;
import java.util.List;

@Repository
public interface BillMaterialPurchaseMapper extends Mapper<BillMaterialPurchase> {

    /**
     * 统计某个组织在某个时间段内的采购单数量
     *
     * @param unitId    组织ID
     * @param dateStart 时间段
     * @param dateEnd   时间端
     * @return 采购单数量
     */
    Integer countPurchaseByUnitId(@Param("unitId") String unitId,
                                  @Param("dateStart") LocalDateTime dateStart,
                                  @Param("dateEnd") LocalDateTime dateEnd);

    List<String> listBillMaterialsPurchaseIds(BillMaterialPurchaseQueryDTO billMaterialPurchaseQueryDTO);

    List<MaterialPurchaseDTO> listMaterialPurchaseByBillPurchaseIds(@Param("billMaterialPurchaseIds") List<String> billMaterialPurchaseIds);

    /**
     * 获取物料采购单基础数据, 不包含关联的动作
     *
     * @param billMaterialPurchaseId 物料采购单ID
     * @return 物料采购单基础数据
     */
    BillMaterialPurchaseDetailDTO getBillPurchaseBasic(String billMaterialPurchaseId);

    /**
     * 根据物料采购单查询所有关联的物料采购情况
     *
     * @param billMaterialPurchaseId 物料采购单ID
     */
    List<MaterialPurchaseDTO> listMaterialPurchase(String billMaterialPurchaseId);

    /**
     * 根据物料采购单查询所有关联的物料到料情况
     *
     * @param billMaterialPurchaseId 物料采购单ID
     */
    List<MaterialArriveDTO> listMaterialArrive(String billMaterialPurchaseId);

    /**
     * 根据物料采购单查询所有关联的流水情况
     *
     * @param billMaterialPurchaseId 物料采购单ID
     */
    List<MaterialRemittanceDetailDTO> listMaterialRemittance(String billMaterialPurchaseId);

    /**
     * 查询某个物料采购单的所有到料状态
     *
     * @param billMaterialPurchaseId 物料采购单ID
     * @return 到料状态集合 true 表示
     */
    List<BillMaterialPurchaseArriveInfoDTO> listArriveStatus(String billMaterialPurchaseId);

    /**
     * 设置物料采购单的到料状态
     *
     * @param billMaterialPurchaseId 物料采购单ID
     * @param arriveStatus           到料状态
     */
    void setArriveStatus(@Param("billMaterialPurchaseId") String billMaterialPurchaseId, @Param("arriveStatus") int arriveStatus);

    /**
     * 查询某个组织下的所有采购单号
     *
     * @param unitId 组织ID
     * @return 采购单号列表
     */
    List<String> listOrderNoByUnitId(String unitId);

    /**
     * 判断采购单是否有到料
     *
     * @param billMaterialPurchaseId 采购单ID
     */
    boolean hasArrived(String billMaterialPurchaseId);

    /**
     * 撤销采购单
     * @param billMaterialPurchaseId
     */
    int undo(@Param("billMaterialPurchaseId") String billMaterialPurchaseId,
                @Param("arriveSatus") int arriveSatus);

    /**
     * 撤销采购单动作
     * @param billMaterialPurchaseId
     */
    int undoAction(@Param("billMaterialPurchaseId") String billMaterialPurchaseId);
}